from collections.abc import Sequence
from typing import Any, Generic, Optional, TypeVar

from fastapi_utils.api_model import APIModel
from pydantic import BaseModel, ConfigDict, Field

DataT = TypeVar("DataT")


class ResultResponse(
    APIModel,
):
    model_config = ConfigDict(from_attributes=True)
    success: bool = Field(default=True, title="请求成功与否")
    msg: str = Field(default="成功", title="请求消息")
    data: Optional[Any] = Field(default=None, title="数据")


# 泛型响应
class GenericResponse(ResultResponse, Generic[DataT]):
    data: Optional[DataT] = Field(default=None, title="数据")


class PageResponse(ResultResponse, Generic[DataT]):
    """
    分页响应
    """

    data: Optional[Sequence[DataT]] = Field(default=None, title="数据")
    count: int = Field(default=0, title="数据总数")
    # current: int = Field(default=1, title="当前页")
    limit: int = Field(default=10, title="每页数据量")
    code: int = Field(default=0, title="状态码")


def success_api(msg: str = "成功", data: Optional[DataT] = None) -> ResultResponse:
    """
    返回成功的 API 响应。

    :param data:
    :param msg: 成功消息内容，默认为 "成功"。
    :return: 返回 JSON 格式的响应，包含 `success` 和 `msg` 字段。
    """
    return ResultResponse(success=True, msg=msg, data=data)


def fail_api(msg: str = "失败") -> ResultResponse:
    """
    返回失败的 API 响应。

    :param msg: 失败消息内容，默认为 "失败"。
    :return: 返回 JSON 格式的响应，包含 `success` 和 `msg` 字段。
    """
    return ResultResponse(success=False, msg=msg)


def table_api(msg: str = "", count: int = 0, data: list[DataT] = None, limit: int = 10) -> PageResponse:
    """
    返回动态表格渲染所需的 API 响应。

    :param msg: 响应消息内容，默认为空字符串。
    :param count: 数据总数，默认为 0。
    :param data: 表格数据，默认为 None。
    :param limit: 每页数据条数，默认为 10。
    :return: 返回 JSON 格式的响应，包含 `msg`、`code`、`data`、`count` 和 `limit` 字段。
    """
    return PageResponse(msg=msg, data=data, count=count, limit=limit)
